#include <QMdiArea>
#include <QMdiSubWindow>
#include <QPainter>
#include <QPaintEvent>
#include <QMouseEvent>
#include <QMessageBox>
#include <QTimer>

#include <stdio.h>
#include <stdlib.h>

#include "QCVModuleHandler.h"

#ifndef QMY_MDIAREA_H
#define QMY_MDIAREA_H

struct Link
{
  pQCVModuleHandler mod1;
  pQCVModuleHandler mod2;
  int idInput;
  bool selected;
};

/**
	@class QMyMdiArea 
	@brief Gere l'affichage et les connections des modules 
*/
class QMyMdiArea:public QMdiArea
{
  Q_OBJECT
  
  public:
    QMyMdiArea();
		
		/**
		@param mod1 : Module1 à connecter en sortie
		@param mod1 : Module2 à connecter en entrée
		@param idInput : Numéro de l'entrée du module 2				
		@brief Crée un lien entre les deux modules si ils existent 
		*/
    void create_link(QCVModuleHandler * mod1,QCVModuleHandler * mod2,int idInput);

		/**
		@param id_mod1 : Numéro du module1 à connecter en sortie
		@param id_mod2 : Numéro du module2 à connecter en entrée
		@param idInput : Numéro de l'entrée du module 2				
		@brief Crée un lien entre les deux modules si ils existent 
		*/
    void create_link(int id_mod1,int id_mod2,int idInput);

		/**
		@param mod1 : Module
		@brief Supprime tous les liens attachés au module passé en paramètre.
		*/
		void remove_links(QCVModuleHandler*);

		/**
		@param mod1 : Module
		@return identifient
		@brief Retourne l'identifient d'un module
		*/
    int getId(QCVModuleHandler*);
    
		/**
		@return : liste de liens
		@brief Retourne la liste des liens entre les modules
		*/
		QList<Link> getLinks();
	
	public slots:
    void remove_selected_links();
	 
  protected:
    void paintEvent(QPaintEvent * paintEvent);
    void mouseMoveEvent(QMouseEvent * e);
    void mousePressEvent(QMouseEvent * e);
    void mouseReleaseEvent(QMouseEvent * e);

  private:

		bool isLinkValid(Link * l);    
		void apply_link(Link * l);
		void remove_link(Link * l);

    QList<Link> links;
    
    bool mousePressed;
    int p1x,p1y,p2x,p2y;
    const static int s=12;
};

#endif
